// 云函数入口文件
const cloud = require('wx-server-sdk')
const rp = require('request-promise')

cloud.init()
// 初始化云数据库
const db = cloud.database()
const playlistCollection = db.collection('playlist')
const MAX_LIMIT = 100
// 云函数入口函数
exports.main = async (event, context) => {
  // 获取云端数据库中的所有信息，但这个方法最多一次只能获取100条信息
  // const list = await playlistCollection.get()
  /* 但往往数据库的信息是不止100条的，下面这个方法在官方文档有介绍，总体思路是如果数据库的信息超过100条，
    就分批获取，一次获取100条并放到一个数组中，知道获取到所有数据
  */
  // 获取数据库中数据的总条数，注意不能await playlistCollection.count().total这样写，因为await
  const countResult = await playlistCollection.count()
  const total = countResult.total

  const batchTimes = Math.ceil(total / MAX_LIMIT)
  const tasks = []
  for (let i = 0; i < batchTimes; i++) {
    /* 一次获取100条数据，放进数组，注意这里不用await,返回的是promise对象，skip方法表示从第几条开始，
      limit表示要获取多少条
    */ 
    let promise = playlistCollection.skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise) 
  }
  // list的设计结构要注意和下面的一致
  let list = {
    data: []
  }
  if (tasks.length>0) {
    // reduce是数组的一个迭代方法，acc表示前一个，cur表示当前，利用它累加数据
    list = (await Promise.all(tasks)).reduce((acc,cur) => {
      return {
        data: acc.data.concat(cur.data)
      }
    })
  }
  const playList = await rp('http://musicapi.leanapp.cn/personalized').
  then(res => {
    return JSON.parse(res).result
  })
  console.log(playList);
  
  // 去重，防止每次调用云函数，获取到和前面获取到的数据相同
  const newData = []
  for (let i = 0; i < playList.length; i++) {
    let flag = true
    for (let j = 0; j < list.data.length; j++) {
      if (playList[i].id === list.data[j].id) {
        flag = false
        break
      }
    }
    if (flag) {
      newData.push(playList[i])
    }
  }

  for (let i = 0; i < newData.length; i++) {
    await playlistCollection.add({
      // data 字段表示需新增的 JSON 数据
      data:{
        // newData的每一条数据都是对象，结构出对象中的所以属性
        ...newData[i],
        // servserDate()是当前上传到数据库的时间，后面可以利用这个属性让最新的数据排在前面显示
        createTime:db.serverDate()
      }
    }).then(res => {
      console.log('添加成功');
    }).catch(err => {
      console.error('添加失败')
    })
  }
  
}